R Lecture 10
웹 앱 개발: 심화

저자


이상일(서울대학교 지리교육과 교수)

공개

2025년 11월 18일

지리공간적 시각화

사례: 전 세계 인구 분포 지도

사례: 전 세계 인구 분포 지도

  • 데이터 레이어

    • 국가 경계, 호수, 그래티큘: 벡터(vector) 데이터

    • 인구밀도, 수심: 래스터(raster) 데이터

  • 데이터 원천

  • 투영법: 로빈슨 도법(Robinson projection)

    • CRS (coordinate reference system, 좌표참조계)
  • 지도화 기법: 컬러, 범례, 주기 표기 등

사례: 전 세계 인구 분포 지도

사례: 전 세계 인구 분포 지도

지리공간적 데이터의 종류

  • 벡터(vector) 데이터

    • 포인트, 라인, 폴리곤

    • 형상 데이터 + 속성 데이터

  • 래스터(raster) 데이터

    • 그리드 셀(grid cell)

    • 일체형

지리공간적 데이터의 종류

지리공간적 데이터의 종류

벡터 데이터

  • 벡터 데이터: 형상 데이터 + 속성 데이터

    • 형상 데이터 (기하, 도형, 공간 데이터)

      • 지리공간적 객체 자체에 대한 데이터

      • 포인트(점), 라인(선), 폴리곤(면)으로 구분

      • 버텍스(vertex)의 좌표값

    • 속성 데이터

      • 지리공간적 객체가 보유한 속성

      • 기존 일반 데이터와 동일

벡터 데이터

  • 형상 데이터: 셰이프 파일(shape file) (ESRI사)

    • sigungu.shp: 버텍스의 좌표값이 포함된 핵심 파일

    • sigungu.shx: 공간적 인덱싱 파일

    • sigungu.dbf: 기본 속성 파일

    • sigungu.prj: 투영 정보 파일

  • 특수한 패키지 필요: sf 패키지

    • st_read() 혹은 read_sf() 함수

벡터 데이터: sf 패키지

벡터 데이터: sf 패키지

구분 함수
읽고 쓰기 st_read(), st_write(), read_sf(), write_sf()
투영 관련 st_crs(), st_transform()
기하 측정 st_area(), st_length(), st_perimeter(), st_distance()
기하 변형 st_centroid(), st_buffer(), st_boundary(), st_simplify()
기하 생성 st_point(), st_voronoi() , st_convex_hull(), st_make_grid()
기하 검토 st_is_valid(), st_make_valid()
기하 중첩 st_filter(), st_intersection(), st_union(), st_crop()
기타 st_coordinates(), st_cast(), st_as_sf(), st_graticule(), st_join()

벡터 데이터: sf 패키지

library(tidyverse)
library(sf)
sigungu_shp <- st_read("sigungu.shp", options = "ENCODING=CP949")
ggplot() + geom_sf(data = sigungu_shp)

벡터 데이터

  • 속성 데이터

    • csv 파일: readr 패키지의 read_csv() 함수

    • 엑셀 파일: readxl 패키지의 read_excel() 함수

    • Open API를 통해 수집: tibble 객체

  • 형상 데이터와 속성 데이터의 결합: dplyr 패키지의 left_join() 함수

    • 왼편: 형상 데이터

    • 오른편: 속성 데이터

래스터 데이터

  • 데이터 형식

    • TIFF 혹은 GeoTIFF
  • 패키지: terra 패키지

    • 불러오기: rast()

    • 변환하기: project(), mosaic(), crop()

    • 계산하기: global(), focal(), zonal()

    • 수 많은 다른 함수들

CRS

CRS: 정의

  • 좌표참조계 Coordinate Reference System

  • 모든 지리공간데이터는 특정한 좌표참조계에 의거해 제작되며 이러한 좌표참조계는 매우 다양함

    • 준거타원체

    • 투영법(map projection)

    • 투영 파라미터: 투영축, 투영격, 중앙경선, 가상원점 등

  • 지리공간데이터의 SRID(Spatial Reference System Identifiers, 공간참조계식별자)

  • sf 패키지: st_crs() 함수

CRS: 방식

  • PROJ 정형문자열

    • https://proj.org/en/9.4/
    • 준거타원체, 투영법, 투영 파라미터를 + 기호로 연결해 작성한 문자열
    • UTM-K
      • +proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m
  • EPSG 숫자코드

    • https://epsg.io/
    • 모든 CRS에 1024~32767 사이의 고유 숫자를 부여
    • UTM-K
      • EPSG: 5179

CRS: PROJ 정형문자열

  • 세계지도를 위한 주요 투영법의 PROJ 별명(alias)
투영법 PROJ 파라미터
정적원통 도법 Equal Area Cylindrical +proj=cea
컴펙트 밀러 도법 Compact Miller +proj=comill
에케르트 IV 도법 Eckert IV +proj=eck4
정거원통 도법 Equidistant Cylindrical +proj=eqc
구드 도법 Goode Homolosine +proj=goode
단열형 구드 도법 Interrupted Goode Homolosine +proj=igh
메르카토르 도법 Mercator +proj=merc
몰바이데 도법 Mollweide +proj=moll
로빈슨 도법 Robinson +proj=robin
시뉴소이드 도법 Sinusoidal +proj=sinu
빈켈트리펠 도법 Winkel Tripel +proj=wintri

CRS: EPSG 숫자코드

  • 널리 사용되는 CRS의 EPSG
적용 스케일 EPSG 숫자코드 설명
전세계 EPSG:4326 WGS84, 측지좌표계, GPS에 사용
EPSG:3857 웹 메르카토르 도법, 구글 맵스, 오픈스트리트맵에서 사용
EPSG:7789 ITRF2014
미국 EPSG:2163 알베르스 정적원추 도법
유럽 EPSG:3035 람베르트 정적방위 도법
우리나라 EPSG:5179 UTM-K
EPSG:5185 서부원점
EPSG:5186 중부원점
EPSG:5187 동부원점
EPSG:5188 동해원점

CRS: 세계지도에 적용

ggplot() +
  geom_sf(data = world) +
  geom_sf(data = ne_bbox, fill = NA) +
  coord_sf(crs = "+proj=eqc") +
  scale_x_continuous(breaks = seq(-180, 180, 30)) +
  scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
  theme(
    panel.background = element_rect("white"),
    panel.grid = element_line(color = "gray80")
  )

ggplot() +
  geom_sf(data = world) +
  geom_sf(data = ne_bbox, fill = NA) +
  coord_sf(crs = "+proj=comill") +
  scale_x_continuous(breaks = seq(-180, 180, 30)) +
  scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
  theme(
    panel.background = element_rect("white"),
    panel.grid = element_line(color = "gray80")
  )

ggplot() +
  geom_sf(data = world) +
  geom_sf(data = ne_bbox, fill = NA) +
  coord_sf(crs = "+proj=robin") +
  scale_x_continuous(breaks = seq(-180, 180, 30)) +
  scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
  theme(
    panel.background = element_rect("white"),
    panel.grid = element_line(color = "gray80")
  )

ggplot() +
  geom_sf(data = world) +
  geom_sf(data = ne_bbox, fill = NA) +
  coord_sf(crs = "+proj=eck4") +
  scale_x_continuous(breaks = seq(-180, 180, 30)) +
  scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
  theme(
    panel.background = element_rect("white"),
    panel.grid = element_line(color = "gray80")
  )

지리공간적 시각화: 정적 vs. 동적

정적 지도: 코로플레스 맵

정적 지도: 두 가지 관점

  • “지도도 그래프다” 관점: 일반성

    • ggplot2 패키지
      • geom_sf(), coord_sf()
  • “지도는 지도이다” 관점: 특수성

    • tmap 패키지
      • 4.2.0

ggplot2 vs tmap: 세계지도

library(tidyverse)
library(spData)
library(sf)
data(world)
world <- st_as_sf(world)
wpp_2024 <- read_rds("wpp_2024.rds")
my_wpp <- wpp_2024 |> 
  filter(year == 2025)
world_data <- world |>
  left_join(my_wpp, join_by(iso_a2 == ISO2))
world_map <- ggplot() +
  geom_sf(data = world_data, aes(fill = TFR, text = name_long)) +
  coord_sf(crs = "+proj=robin") +
  scale_fill_viridis_c() +
  scale_x_continuous(breaks = seq(-180, 180, 30)) +
  scale_y_continuous(breaks = c(-89.5, seq(-60, 60, 30), 89.5)) +
  theme(
    panel.background = element_rect("white"),
    panel.grid = element_line(color = "gray80")
  )
world_map

library(tmap)
tm_world_map <- tm_shape(world_data, crs = "+proj=robin") +
  tm_graticules(
    labels.show = FALSE,
    x = seq(-180, 180, 30), 
    y = c(-89.5, seq(-60, 60, 30), 89.5)
  ) + 
  tm_polygons(
    fill = "TFR", 
    fill.scale = tm_scale_continuous(values = "viridis")
  ) +
  tm_layout(frame = FALSE)
tm_world_map

ggplot2 vs tmap: 우리나라 지도

library(tidyverse)
library(sf)
sido_shp <- st_read("sido.shp", options = "ENCODING=CP949")
sigungu_shp <- st_read("sigungu.shp", options = "ENCODING=CP949")
data_sigungu <- read_rds("data_sigungu.rds")
sigungu_data <- sigungu_shp |> 
  left_join(data_sigungu, join_by(SGG1_CD == C1))
library(ggspatial)
sigungu_data <- sigungu_data |> 
  mutate(
    index_class = case_when(
      index < 0.2 ~ "1",
      index >= 0.2 & index < 0.5 ~ "2",
      index >= 0.5 & index < 1.0 ~ "3",
      index >= 1.0 & index < 1.5 ~ "4",
      index >= 1.5 ~ "5"
    ),
    index_class = fct(index_class, levels = as.character(1:5))
  )
class_color <- c("1" = "#d7191c", "2" = "#fdae61",
                 "3" = "#ffffbf", "4" = "#a6d96a", 
                 "5" = "#1a9641")
ggplot_map <- ggplot() +
  geom_sf(
    data = sigungu_data, 
    aes(fill = index_class, text = SGG1_FNM), 
    show.legend = TRUE
  ) +
  geom_sf(
    data = sido_shp, 
    fill = NA, 
    lwd = 0.5
  ) +
  scale_fill_manual(
    name = "Classes", 
    labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0", 
               "1.0 ~ 1.5", ">= 1.5"), 
    values = class_color, drop = FALSE
  ) +
  annotation_scale(
    location = "br", 
    bar_cols = c("gray40", "white"), 
    width_hint = 0.4
  )
ggplot_map

class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
tmap_map <- tm_graticules(labels.cardinal = TRUE) +
  tm_shape(sigungu_data) + 
  tm_polygons(
    fill = "index", id = "SGG1_FNM", 
    fill.scale = tm_scale_intervals(
      values = class_color, 
      breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf), 
      labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0", 
               "1.0 ~ 1.5", ">= 1.5")
    ),
    fill.legend = tm_legend(title = "Classes")
  ) +
  tm_shape(sido_shp) + tm_borders(lwd = 1.5) +
  tm_scalebar(breaks = seq(0, 200, 50)) 
tmap_map

인터랙티브 지도: ggplotly() 함수

library(plotly)
ggplotly(world_map)
library(plotly)
ggplotly(world_map)

인터렉티브 지도: ggiraph 패키지

library(ggiraph)
sigungu_data <- sigungu_data |> 
  mutate(
    index = format(index, digits = 4, nsmall = 4),
    my_tooltip = str_c("Name: ", SGG1_FNM, "\n Index: ", index)
  )
gg <- ggplot() +
  geom_sf_interactive(
    data = sigungu_data, 
    aes(fill = index_class, tooltip = my_tooltip, data_id = SGG1_FNM), 
    show.legend = TRUE
  ) +
  geom_sf(data = sido_shp, fill = NA, lwd = 0.5) +
  scale_fill_manual(
    name = "Classes", 
    labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0", "1.0 ~ 1.5", ">= 1.5"), 
    values = class_color, drop = FALSE
  ) 
girafe(ggobj = gg) |> 
  girafe_options(opts_hover(css = "fill: gray"))

leaflet: 자바스크립트 라이브러리

leaflet: 단순 일반도

library(leaflet)
leaflet() |> 
  addTiles() |> 
  addPopups(126.955184, 37.460422, "Sang-Il's Office",
            options = popupOptions(closeButton = FALSE))

leaflet: 매시업(mashup) 주제도

library(leaflet)
world_data <- world_data |> filter(!is.na(TFR))

bins <- c(0, 1.5, 2.1, 3, 4, 5, Inf)
pal <- colorBin("YlOrRd", domain = world_data$TFR, bins = bins)
labels <- sprintf("<strong>%s</strong><br/>%g",
  world_data$name_long, world_data$TFR) |> lapply(htmltools::HTML)

leaflet(world_data) |> 
  addProviderTiles(providers$Esri.WorldTopoMap) |> 
  addPolygons(
    fillColor = ~pal(TFR), weight =  2, opacity = 1, color = "white", 
    dashArray = "3", fillOpacity = 0.6,
    highlightOptions = highlightOptions(
      weight = 5, color = "#666", dashArray = "", 
      fillOpacity = 0.6, bringToFront = TRUE
    ),
    label = labels,
    labelOptions = labelOptions(
      style = list("font-weight" = "normal", padding = "3px 8px"), 
      textsize = "15px", direction = "auto"
    )
  ) |> 
  addLegend(
    pal = pal, values = ~TFR, opacity = 0.6, title = NULL, position = "bottomright"
  )
library(leaflet)

world_data <- world_data |> filter(!is.na(TFR))

bins <- c(0, 1.5, 2.1, 3, 4, 5, Inf)
pal <- colorBin("YlOrRd", domain = world_data$TFR, bins = bins)
labels <- sprintf("<strong>%s</strong><br/>%g",
  world_data$name_long, world_data$TFR) |> lapply(htmltools::HTML)

leaflet(world_data) |> 
  addProviderTiles(providers$Esri.WorldTopoMap) |> 
  addPolygons(
    fillColor = ~pal(TFR), weight =  2, opacity = 1, color = "white", 
    dashArray = "3", fillOpacity = 0.6,
    highlightOptions = highlightOptions(
      weight = 5, color = "#666", dashArray = "", 
      fillOpacity = 0.6, bringToFront = TRUE
    ),
    label = labels,
    labelOptions = labelOptions(
      style = list("font-weight" = "normal", padding = "3px 8px"), 
      textsize = "15px", direction = "auto"
    )
  ) |> 
  addLegend(
    pal = pal, values = ~TFR, opacity = 0.6, title = NULL, position = "bottomright"
  )
library(tmap)
class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
sigungu_data <- sigungu_data |> mutate(index = as.numeric(index))
tmap_mode(mode = "view")
my_tmap <- tm_shape(sigungu_data) + 
  tm_polygons(
    fill = "index", fill_alpha = 0.6, col_alpha = 0.5,
    popup.vars = c("지역소멸위험지수: " = "index"), 
    popup.format = list(index = list(digits = 3)), 
    id = "SGG1_FNM", 
    fill.scale = tm_scale_intervals(
      values = class_color, breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf), 
      labels = c("< 0.2", "0.2~0.5", "0.5~1.0", "1.0~1.5", ">= 1.5")
    ),
    fill.legend = tm_legend(title = "Classes")
  ) +
  tm_shape(sido_shp) + tm_borders(lwd = 2)
my_tmap
class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
sigungu_data <- sigungu_data |> mutate(index = as.numeric(index))
tmap_mode(mode = "view")
my_tmap <- tm_shape(sigungu_data) + 
  tm_polygons(
    fill = "index", fill_alpha = 0.6, col_alpha = 0.5,
    popup.vars = c("지역소멸위험지수: " = "index"), 
    popup.format = list(index = list(digits = 3)), 
    id = "SGG1_FNM", 
    fill.scale = tm_scale_intervals(
      values = class_color, breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf), 
      labels = c("< 0.2", "0.2~0.5", "0.5~1.0", "1.0~1.5", ">= 1.5")
    ),
    fill.legend = tm_legend(title = "Classes")
  ) +
  tm_shape(sido_shp) + tm_borders(lwd = 2)
my_tmap

LLM-기반 웹 앱 내용 요소

LLM: 개념

  • Large Language Model (거대 언어 모델)

LLM: 개념

LLM API: 프로그래밍적 접근

  • LLM을 웹 인터페이스에서 사용하는 것이 아니라, 코드로 직접 제어하고 자동화하는 방식

  • API(Application Programming Interface, 응용프로그램 프로그래밍 인터페이스)

    • 응용프로그램(예: 웹 앱)이 프로그래밍을 통해 다른 프로그램이나 서비스(예: ChatGPT)와 상호작용하도록 해 주는 접점

    • HTTP 요청(POST) + JSON 구조로 메시지 전달

    • 모델 이름, 메시지, 파라미터를 코드로 지정

    • 응답은 JSON 형태의 텍스트/토큰

  • 대량 처리, 반복 처리, 자동화, 소프트웨어 통합

LLM API: 기본 구조

  • 요청(request) 구성 요소

    • Base URL: 모델 서버의 접속 주소, https://api.openai.com/v1

    • 모델 이름: gpt-5.1

    • API Key (인증): 사용자 신원 증명 토큰

    • 메시지: 모델에 보낼 내용, JSON 배열로 구성

  • 응답(response) 구성 요소

    • 모델 출력 텍스트: 모델이 생성한 실제 답변

    • 토큰 사용량: 과금 및 모델 내부 처리량 계산에 사용

    • 메시지 구조(JSON)

사례: Google Gemini

  • Google AI Studio(https://aistudio.google.com/app/) 접속

    • 구글 계정 로그인 필요
  • 왼쪽 하단에서 Get API Key 클릭

  • 오른쪽 상단에서 API 키 만들기 클릭

  • 새 키 만들기 창

    • 키 이름 지정: 이름 지정

    • 가져온 프로젝트 선택: 프로젝트 가져오기 혹은 프로젝트 만들기

  • 오른쪽 아이콘 중 Copy API key 선택

사례: Google Gemini

  • 콘솔: usethis::edit_r_environ() 실행

  • .Renviron 파일

    • GEMINI_API_KEY=your_key_here

    • 저장

  • Session > Restart R 실행

ellmer 패키지

ellmer 패키지

library(ellmer)
chat <- chat_google_gemini(
  base_url = "https://generativelanguage.googleapis.com/v1beta/",
  api_key = Sys.getenv("GEMINI_API_KEY"),
  model = "gemini-2.5-flash",
  system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")
library(ellmer)
chat <- chat_google_gemini(
  base_url = "https://generativelanguage.googleapis.com/v1beta/",
  api_key = Sys.getenv("GEMINI_API_KEY"),
  model = "gemini-2.5-flash",
  system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")
서울대학교 AI융합교육학과는 4차 산업혁명 시대의 핵심 동력인 인공지능(AI)과 교육을 융합하여 미래 교육을 선도할 전문가를 양성하기 위해 
설립된 **혁신적인 학과**입니다.

급변하는 사회 속에서 AI는 교육의 패러다임을 근본적으로 변화시키고 있으며, AI를 올바르게 이해하고 교육에 효과적으로 적용하며 미래 세대에게
가르칠 수 있는 전문가는 필수적입니다. 서울대학교 AI융합교육학과는 이러한 시대적 요구에 부응하여 AI 시대에 필요한 교육 혁신을 이끌어갈 
'AI 교육 전문가' 양성을 목표로 합니다.

**주요 특징 및 교육 목표:**

1.  **AI 전문성 함양:** 인공지능의 기본 원리, 데이터 과학, 머신러닝, 딥러닝 등 AI 핵심 기술에 대한 깊이 있는 이해와 실용적인
역량을 습득합니다. 단순히 AI를 사용하는 것을 넘어, AI의 작동 방식과 윤리적 문제 등을 심층적으로 탐구합니다.

2.  **교육학 전문성 강화:** 교육학의 제반 이론(교육심리, 교육과정, 교육공학, 교수설계 등)은 물론, AI 시대에 맞는 교수법 개발,
학습자 맞춤형 교육 설계, 디지털 교육 콘텐츠 기획 및 구현 등 교육 혁신을 위한 전문 지식을 학습합니다.

3.  **융합적 사고와 실천:** 두 분야의 지식을 통합하여 AI 기반 교육 시스템 설계, 지능형 학습 환경 구축, AI 윤리 교육, 컴퓨터
과학 교육, SW 교육 등 실제 교육 현장에 적용 가능한 융합적 역량을 키웁니다. 이론과 실습의 균형 잡힌 교육과정을 통해 실제 교육 현장에서
필요한 문제 해결 능력을 함양합니다.

4.  **미래 교육 리더 양성:** 서울대학교라는 국내 최고 수준의 연구 및 교육 인프라를 바탕으로, 관련 분야 최고 전문가 교수진의 지도를
받으며 최첨단 교육 환경에서 학습할 수 있습니다. 미래 교육의 방향을 제시하고 변화를 주도할 수 있는 리더십을 갖춘 인재로 성장하도록 
지원합니다.

**졸업 후 진로:**

서울대학교 AI융합교육학과 졸업생들은 AI와 교육 분야의 융합 전문가로서 다양한 분야로 진출할 수 있습니다.

*   **교육 현장:** 초/중/고등학교의 AI 교육 담당 교사, 대학교수 및 연구원
*   **연구 기관:** 교육 관련 연구기관의 AI 교육 연구원
*   **에듀테크 기업:** AI 교육 콘텐츠 개발자 및 기획자, 학습 플랫폼 설계자
*   **정부 및 공공기관:** 교육부, 시도교육청 등 교육 정책 수립을 담당하는 AI 교육 정책 전문가, 디지털 교육 전문가
*   **국제기구:** 유네스코 등 국제기구의 디지털 교육 관련 전문가

서울대학교 AI융합교육학과는 AI와 교육 모두에 깊은 관심과 열정을 가진 학생, 미래 교육의 변화를 주도하고 싶은 학생들에게 최적화된 
학과입니다. AI와 교육의 융합을 통해 미래 교육의 새로운 지평을 열어갈 여러분의 도전을 기다립니다.

로컬 LLM: Ollama

  • Ollama 홈페이지 접속: https://ollama.com/

  • Download 클릭

    • Windows / macOS / Linux 중 하나를 선택
  • 모델 다운로드: Windows PowerShell 실행

    • ollama pull gemma3:4b
  • 실행

로컬 LLM: Ollama

library(ellmer)
chat <- chat_ollama(
  base_url = "http://localhost:11434",
  model = "gemma3:4b",
  system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")
library(ellmer)
chat <- chat_ollama(
  base_url = "http://localhost:11434",
  model = "gemma3:4b",
  system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")
서울대학교 AI융합교육학과에 대해 자세히 소개해 드리겠습니다. 

**1. 개요:**

*   **설립 목표:** 인공지능(AI) 기술의 발전 속도에 발맞춰 AI를 교육과정에 심층적으로 융합하고, 미래 사회를 이끌어갈 창의적 AI
리더 양성을 목표로 설립되었습니다. 단순한 AI 지식 전달을 넘어 AI 기술을 이해하고 활용하며, AI 시사 문제에 대해 비판적으로 사고할 수
있는 인재를 육성하는 데 집중합니다.
*   **설립 배경:** 급변하는 사회에서 AI 기술의 중요성이 커짐에 따라, AI 기술을 교육적으로 활용하는 방안에 대한 필요성이 
대두되었습니다. 서울대학교는 이러한 요구에 부응하여 AI 융합 교육의 선도적인 역할을 수행하기 위해 AI융합교육학과를 설립하게 되었습니다.
*   **개설 학부:** 서울대학교 교육대학원

**2. 교육 과정:**

*   **학위:** 석사
*   **주요 교육 내용:**
    *   **AI 기초:** AI의 기본 원리, 머신러닝, 딥러닝 등 AI 기술의 핵심 이론 및 방법론 학습
    *   **교육학 이론:** 교육 철학, 학습 이론 등 교육학적 기초 지식 학습
    *   **AI 융합 교육 설계:** AI 기술을 교육 과정에 효과적으로 통합하는 설계 방법론 학습
    *   **AI 시사 문제:** AI 윤리, AI 정책, AI의 사회적 영향 등 AI 관련 시사 문제에 대한 심층적 토론 및 분석
    *   **융합 프로젝트:** AI 기술과 교육학적 지식을 융합한 프로젝트 수행 (AI 기반 교육 콘텐츠 개발, AI 튜터링 시스템 
설계 등)
*   **전공 선택:** AI 융합 교육 전공 (AI 교육 콘텐츠 개발, AI 튜터링 시스템 설계, AI 기반 평가 시스템 설계 등)

**3. 커리큘럼 특징:**

*   **AI 기술과 교육학의 융합:** AI 기술에 대한 깊이 있는 이해를 바탕으로 교육학적 지식을 적용하여 실제 교육 현장에서 활용 
가능한 교육 모델 개발에 주력합니다.
*   **프로젝트 중심 교육:** 이론 학습과 함께 실제 문제 해결 능력을 키울 수 있도록 다양한 융합 프로젝트를 수행합니다.
*   **산학 협력:** 국내외 유수 기업 및 연구기관과의 협력을 통해 실제 교육 현장의 요구를 반영하고, 최신 AI 기술 트렌드를 
습득합니다.

**4. 졸업 목표:**

*   AI 기술을 교육 현장에 적용할 수 있는 전문성을 갖춘 인재
*   AI 관련 시사 문제에 대한 비판적 사고 능력을 갖춘 리더
*   AI 교육 콘텐츠 개발, AI 튜터링 시스템 설계 등 AI 융합 교육 분야의 전문가

**5. 추가 정보:**

*   **학과 홈페이지:** [https://www.snu.ac.kr/aiedu/](https://www.snu.ac.kr/aiedu/)
*   **학과 소개 영상:** [유튜브 영상 링크](https://m.youtube.com/watch?v=QY-oFk4HlV4)
*   **학과 문의:** ai.edu@snu.ac.kr

**6. 관련 정보 검색:**

*   **서울대학교 AI융합교육학과 관련 뉴스 기사:** 
[https://www.sisajournel.com/news/articleView.html?idxno=302682](https://www.sisajournel.com/news/articleView.html?idxno=302682)
*   **학과 소개 영상:** [유튜브 영상 링크](https://m.youtube.com/watch?v=QY-oFk4HlV4)

더 궁금한 점이 있으시면 언제든지 질문해주세요.

LLM과 웹 앱

맨 위로